export default {
  state: {
    shoppingCart: {}
    // shoppingCart结构
    //其中除了is_check其他都是从数据库中读出来的
    //is_check是在前端定义的 只有当点击复选框的时候 shoppingCart[]中会自动定义一个is_check
    //注意 上面说的不争取 因为购物车中会用到computed监控IsAllCheck属性 经过实验发现
    //如果is_check 不在数据库中定义 那么前端点击全选按钮的时候 没有反应 不会实现监控IsAllCheck的效果
    //在数据库中购物车加一个is_check属性 之前相当于在前端添加的属性 无法监控computed
    /**
     * 尝试这样定义shoppingCart：{
     *    is_check:false
     *  }
     * 也不行 必须在数据库里定义is_check 返回到前端才行
     * 
     * 
     */

   /*
    shoppingCart :{
      sc_id: "", // 购物车id
      product_id: "", // 商品id
      product_name: "", // 商品名称
      product_picture: "", // 商品图片
      product_selling_price: "", // 商品价格
      num: "", // 购物车中商品数量
      product_max_num: "", // 每种商品限购数量
      is_check: false // 是否勾选
    }
    */
  },
  getters: {
    getShoppingCart (state) {
      // 获取购物车状态
      return state.shoppingCart;
    },
    getNum (state) {
      // 购物车商品总数量
      let totalNum = 0;
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        totalNum += temp.num;
      }
      return totalNum;
    },
    getIsAllCheck (state) {
      // 判断是否全选
      let isAllCheck = true;
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        // 只要有一个商品没有勾选立即return false;
        if (!temp.is_check) {
          isAllCheck = false;
          
          return isAllCheck;
        }
      }
      return isAllCheck;
    },
    getCheckGoods (state) {
      // 获取勾选的商品信息
      // 用于确认订单页面
      let checkGoods = [];
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        if (temp.is_check) {
          checkGoods.push(temp);
        }
      }
      return checkGoods;
    },
    getCheckNum (state) {
      // 获取购物车勾选的商品数量
      let totalNum = 0;
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        if (temp.is_check) {
          totalNum += temp.num;
        }
      }
      return totalNum;
    },
    getTotalPrice (state) {
      // 购物车勾选的商品总价格
      let totalPrice = 0;
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        if (temp.is_check) {
          totalPrice += temp.product_selling_price * temp.num;
        }
      }
      return totalPrice;
    }
  },
  mutations: {
    setShoppingCart (state, data) {
      // 设置购物车状态
      state.shoppingCart = data;
    },
    unshiftShoppingCart (state, data) {
      // 添加购物车
      // 用于在商品详情页点击添加购物车,后台添加成功后，更新vuex状态
      state.shoppingCart.unshift(data);
    },
    updateShoppingCart (state, payload) {
      // 更新购物车
      // 可更新商品数量和是否勾选
      // 用于购物车点击勾选及加减商品数量
      if (payload.prop == "num") {
        // 判断效果的商品数量是否大于限购数量或小于1
        if (state.shoppingCart[payload.key].product_max_num < payload.val) {
          return;
        }
        if (payload.val < 1) {
          return;
        }
      }
      // 根据商品在购物车的数组的索引和属性更改
      state.shoppingCart[payload.key][payload.prop] = payload.val;
    },
    addShoppingCartNum (state, product_id) {
      // 增加购物车商品数量
      // 用于在商品详情页点击添加购物车,后台返回002，“该商品已在购物车，数量 +1”，更新vuex的商品数量
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        if (temp.product_id == product_id) {
          if (temp.num < temp.product_max_num) {
            temp.num++;
          }
        }
      }
    },
    deleteShoppingCart (state, sc_id) {
      // 根据购物车id删除购物车商品
      for (let i = 0; i < state.shoppingCart.length; i++) {
        const temp = state.shoppingCart[i];
        if (temp.sc_id == sc_id) {
          state.shoppingCart.splice(i, 1);
        }
      }
    },
    checkAll (state, data) {
      // 点击全选按钮，更改每个商品的勾选状态
      for (let i = 0; i < state.shoppingCart.length; i++) {
        state.shoppingCart[i].is_check = data;
      }
    }
  },
  actions: {
    setShoppingCart ({ commit }, data) {
      commit('setShoppingCart', data);
    },
    unshiftShoppingCart ({ commit }, data) {
      commit('unshiftShoppingCart', data);
    },
    updateShoppingCart ({ commit }, payload) {
      commit('updateShoppingCart', payload);
    },
    addShoppingCartNum ({ commit }, product_id) {
      commit('addShoppingCartNum', product_id);
    },
    deleteShoppingCart ({ commit }, sc_id) {
      commit('deleteShoppingCart', sc_id);
    },
    checkAll ({ commit }, data) {
      commit('checkAll', data);
    }
  }
}